package com.itany.corejava.code06_面向对象.封装;

/**
 * @author 石小俊
 * @date 2024年01月16日 9:54
 */
public class Poker {
    private Card[] cards;

    public Card[] getCards() {
        return cards;
    }

    public void setCards(Card[] cards) {
        this.cards = cards;
    }

    public Poker() {
        // 为一副牌填充54张牌
        cards = new Card[54];
        // 定义每张牌的花色值的范围
        String[] colors = {"红桃", "方块", "梅花", "黑桃"};
        String[] nums = {"A", "2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K"};
        // 通过双重for循环,将花色与点数分别赋值给每一个Card对象
        // 定义cards的初始下标,下标从0开始
        int index = 0;
        // 外层循环控制花色
        for (int i = 0; i < colors.length; i++) {
            // 内层循环控制点数
            for (int j = 0; j < nums.length; j++) {
                cards[index++] = new Card(colors[i], nums[j]);
            }
        }
        // 除了上述牌意外,还有大王与小王
        cards[index++] = new Card("大", "王");
        cards[index++] = new Card("小", "王");
    }

    /**
     * 创建一个洗牌方法,将牌的顺序打乱后展示
     */
    public void shuffleCard() {
        // 定义一个相同长度、类型的数组,用于接收洗牌后的数据
        Card[] cards = new Card[54];
        // 为洗牌后的数组的元素赋值,其值取自于洗牌前的数组
        for (int i = 0; i < cards.length; i++) {
            // 随机获取未洗牌前数组的元素
            // 即:获取未洗牌前数组中随机下标的元素,下标范围:0-53
            int index = (int) (Math.random() * 54);
            Card card = this.cards[index];
            // 随机获取的元素可能存在重复的
            while (card == null) {
                // 如果取出来的元素为null,说明该下标的元素已经重复赋值过了
                // 因此,重新随机一张
                index = (int) (Math.random() * 54);
                card = this.cards[index];
            }
            // 如果取出来的元素不为null,说明尚未取出过
            cards[i] = card;
            // 当获取到对应元素之后,未洗牌前的数组对应元素可以设置为null
            this.cards[index] = null;
        }
        this.cards = cards;
    }
}
